rychlost - pomalost DBExpressu
Otázka od: Hlas
16. 9. 2002 22:52
vytvoril som si skusobnu aplikaciu v dbexpresse. v databaze pouzivam 3 tabulky.
po testoch som bol zhrozeny casmi, ktore som nameral.
otvaranie tychto 3 tabuliek cca 5 sek - tabulky su skoro prazdne.
20 zapisov do 1 tabulky v cykle cca 35 sek.
mozem robit niekde chybu alebo je to take pomale?
Pouzivam: W2k, PIII 1GHz, D6Enterprise, IB6, komponenty SQLConnection,
SQLClientDataSet.
Rovnako je to pomale na sieti, aj na jednom pocitaci. Zda sa, ze pomalost
sposobuje componenta
SQLClientDataset, pretoze ten cas je strasne dlhy este pred applyupdates a
commitupdates, takze vlastne
IB este ani nie je v hre, vsetko sa odohrava v pamati.
Netusite niekto, ci je to normalne. Odhadujem, ze pri takychto rychlostiach mi
zapis do 5-10 tabuliek
cca 50 zaznamov moze trvat aj minutu...??? ved to je nepouzitelne...
Odpovedá: Redlich Software
17. 9. 2002 8:19
Pred rokem jsem DBExpress zkousel proti IB. Otevreni tabulek (vysledny seznam v
radu desitek zaznamu) bylo celkem v poradku (presne si to nepamatuji, ale cas
byl v desetinach sekundy, nicmene to pochopitelne trvalo dele nez u
IBExpressu). Bohuzel jsem ale narazil na problem pri otevreni tabulky bez
zaznamu, kdy otevreni opravdu trvalo radove vteriny. Tenkrate mi posilal
komentar Pavel Cisar, ktery rikal, ze v DBExpressu byla nejaka chyba a ze ji
snad Borland odstranil.
Protoze se mi problem projevoval dale a v podstate nebyla zaruka, ze se stav
nebude zhorsovat ci se problemy neprojevi nekde jinde, tak jsem DBExpress
opustil.
Asi predevcirem tu sel mail (myslim od P.Vonese), v nemz autor tvrdil, ze v D7
je DBExpress v lepsim stavu. Pokud by jsi to zkoumal, napis do konference
vysledek.
Zdar tvemu dilu
Dan
----- Original Message -----
From: Hlas
To: delphi-l@clexpert.cz
Sent: Monday, September 16, 2002 9:18 PM
Subject: rychlost - pomalost DBExpressu
vytvoril som si skusobnu aplikaciu v dbexpresse. v databaze pouzivam 3
tabulky.
po testoch som bol zhrozeny casmi, ktore som nameral.
otvaranie tychto 3 tabuliek cca 5 sek - tabulky su skoro prazdne.
20 zapisov do 1 tabulky v cykle cca 35 sek.
mozem robit niekde chybu alebo je to take pomale?
Pouzivam: W2k, PIII 1GHz, D6Enterprise, IB6, komponenty SQLConnection,
SQLClientDataSet.
Rovnako je to pomale na sieti, aj na jednom pocitaci. Zda sa, ze pomalost
sposobuje componenta
SQLClientDataset, pretoze ten cas je strasne dlhy este pred applyupdates a
commitupdates, takze vlastne
IB este ani nie je v hre, vsetko sa odohrava v pamati.
Netusite niekto, ci je to normalne. Odhadujem, ze pri takychto rychlostiach
mi zapis do 5-10 tabuliek
cca 50 zaznamov moze trvat aj minutu...??? ved to je nepouzitelne...
Odpovedá: Jan Sebelík
17. 9. 2002 15:44
Odesílatel: Hlas <hlas@inmail.sk>
Pouzivam: W2k, PIII 1GHz, D6Enterprise, IB6, komponenty SQLConnection,
SQLClientDataSet.
Rovnako je to pomale na sieti, aj na jednom pocitaci. Zda sa, ze pomalost
sposobuje componenta
SQLClientDataset, pretoze ten cas je strasne dlhy este pred applyupdates a
commitupdates, takze vlastne
IB este ani nie je v hre, vsetko sa odohrava v pamati.
Neodpovim primo, protoze dbExpress (v praxi) nepouzivam, pokusim se jenom o
tip:
Predevsim bych se pokusil odmonitorovat casy nejak "oddelene":
otevreni databaze (connect)
otevreni tabulky (tabulek)
nacitani dat
insert (update) v datasetu
applyupdates
commit
Pak se mi zuzi prostor pro hledani problemu.
Misto SQLClientDataSet bych pouzil SQLDataSet + DataSetProvider +
ClientDataSet.
Bude se mi to lepe monitorovat (odchytavani udalosti na TDataSetProvider resp.
TClientDataSet).
To tim spis, ze problemy vidis uz pred ApplyUpdates!
TClientDataSet se mi (v jinem kontextu) choval velmi rozumne.
A predevsim: pokud se dbExpress ukaze jako spatne pouzitelny, snadno vymenim
SQLDataSet za IBDataSet.
SQLClientDataSet (stejne jako BDEClientDataSet a IBClientDataSet) je podivny
hybrid.
Honza
=========================================
= HAES - RNDr. Jan Sebelik
= http://www.haes.cz
= Skolici a konzultacni stredisko pro Delphi a Win32
= Vojtiskova 206
= 507 81 Lazne Belohrad
= tel. 0434 692 569 (0776 347735)
=========================================
Odpovedá: Petr Vones
17. 9. 2002 16:13
From: "Redlich Software" <RedlichDaniel@seznam.cz>
> Asi predevcirem tu sel mail (myslim od P.Vonese), v nemz autor tvrdil, ze v
> D7 je DBExpress v lepsim stavu. Pokud by jsi to zkoumal, napis do konference
Pochybuji ze bych psal neco konkretniho o pouzivani dbExpressu <g> Pokud vim,
tak i pro D6 byly snad ke stazeni nejake opravene drivery pro dbExpress,
podrobnosti nevim je treba se podivat na http://community.borland.com
Petr Vones
Odpovedá: Hlas
20. 9. 2002 15:12
ja som sa tu pytal pred casom na pomalost dbx-sqlclientdataset a ktosi chcel
vediet
vysledok ako to dopadlo - ak nieco zistim.
Zistil som - trochu som precital help k D6 komponente sqlclientdataset:
TSQLClientDataSet is not recommended for use in master/detail relationships. It
can't optimize the queries it uses for this purpose, resulting in very slow performance.
Takze cele dbx vyzera velmi zaujimavo:
1. najprv sa clovek dozvie, ze je to vyborna vec, ze je to rychle. --------->>>>
2. potom sa dozviem, ze sa jedna o jedmosmerne kurzory a neda sa s tym v podstate nic robit. --------->>>>
3. potom sa dozviem, ze je tam komponenta sqlclientdataset, ktoru ked pouzijem, tak je vsetko ok --------->>>>
4. a potom sa dozviem, ze ak sa jedna o vazbu master-detail, tak je nepouzitelna, lebo je neskutocne pomala --------->>>>
----- Original Message -----
From: Hlas
To: delphi-l@clexpert.cz
Sent: Monday, September 16, 2002 9:18 PM
Subject: rychlost - pomalost DBExpressu
vytvoril som si skusobnu aplikaciu v dbexpresse. v databaze pouzivam 3 tabulky.
po testoch som bol zhrozeny casmi, ktore som nameral.
otvaranie tychto 3 tabuliek cca 5 sek - tabulky su skoro prazdne.
20 zapisov do 1 tabulky v cykle cca 35 sek.
mozem robit niekde chybu alebo je to take pomale?
Pouzivam: W2k, PIII 1GHz, D6Enterprise, IB6, komponenty SQLConnection, SQLClientDataSet.
Rovnako je to pomale na sieti, aj na jednom pocitaci. Zda sa, ze pomalost sposobuje componenta
SQLClientDataset, pretoze ten cas je strasne dlhy este pred applyupdates a commitupdates, takze vlastne
IB este ani nie je v hre, vsetko sa odohrava v pamati.
Netusite niekto, ci je to normalne. Odhadujem, ze pri takychto rychlostiach mi zapis do 5-10 tabuliek
cca 50 zaznamov moze trvat aj minutu...??? ved to je nepouzitelne...
Odpovedá: Jan Sebelík
20. 9. 2002 16:11
Odesílatel: Hlas <hlas@inmail.sk>
Takze cele dbx vyzera velmi zaujimavo:
1. najprv sa clovek dozvie, ze je to vyborna vec, ze je to rychle. ---------
>>>>
2. potom sa dozviem, ze sa jedna o jedmosmerne kurzory a neda sa s tym v
podstate nic robit. --------->>>>
3. potom sa dozviem, ze je tam komponenta sqlclientdataset, ktoru ked pouzijem,
tak je vsetko ok --------->>>>
4. a potom sa dozviem, ze ak sa jedna o vazbu master-detail, tak je
nepouzitelna, lebo je neskutocne pomala --------->>>>
[Honza]
Jeste se s dovolenim vratim ke svemu navrhu misto TSQLClientDataSet pouzit
TClientDataSet + TDataSetProvider + TSQLDataSet (nebo jiny dataset).
(TSQLClientDataSet interne obsahuje prave tyto tri komponenty).
Pak jsou dve moznosti, jak realizovat master-detail vazbu.
Nevim, kterou z techto moznosti TSQLClientDataSet interne implemetuje.
Stalo by za to otestovat, zda jsou obe moznosti spatne (myslim, ze ne).
Pokud ano, snadno zamenim SQLDataSet za neco jineho s tim, ze veskere dalsi
vazby (TClientDataSet, TDataSetProvider) vcetne veskereho klientskeho
programovani nad TClientDataSet mi zustane beze zmeny.
1.
Pokud svazu master-detail ty SQLDataSety, pak do jedineho TClientDataSet
(privazaneho pres ProviderName na master) dostavam detail tabulku jako
TDatasetField.
Na tuto detail tabulku pak navazu dalsi TClientDataSet pres property
DataSetField.
Tento "detail" ClientDataSet pak nema ProviderName, nekomunikuje tedy s
databazi. Veskere updaty (i te detail tabulky) se provadeji master
ClientDataSet.
2.
"Master" i "detail" ClientDataSet ma svuj provider. Jsou svazany pres
MasterSource a MasterField.
Pak si kazdy ClientDataSet nacita cela data sam a k vazbe dochazi az na urovni
techto ClientDataSetu.
Je to cele v pameti, takze by to melo byt docela rychle.
Honza
=========================================
= HAES - RNDr. Jan Sebelik
= http://www.haes.cz
= Skolici a konzultacni stredisko pro Delphi a Win32
= Vojtiskova 206
= 507 81 Lazne Belohrad
= tel. 0434 692 569 (0776 347735)
=========================================
Odpovedá: Ondrej Kelle
20. 9. 2002 15:47
Na http://community.borland.com/article/0,1410,29106,00.html je novy clanok
o dbExpress s vysvetlenim, ako je to myslene, nazyvaju to "provide/resolve"
data access strategy.
Zatial som dbExpress nepouzil, ale bude myslim stat za to pozorne si to
precitat a odskusat...
HTH
TOndrej
Odpovedá: Skopalik Slavomir
20. 9. 2002 15:59
>
> 2.
> "Master" i "detail" ClientDataSet ma svuj provider. Jsou svazany pres
MasterSource a MasterField.
> Pak si kazdy ClientDataSet nacita cela data sam a k vazbe dochazi az na
urovni techto ClientDataSetu.
> Je to cele v pameti, takze by to melo byt docela rychle.
Myslim, ze tohle je prave ten problem. Normalni vazba Master-Detail je pres
index, tim DB stroj eliminuje
znacnou cast operaci (tedy pokud se bavime o veljkych datech a inteligentnim
navrhu DB).
Podle meho je NUTNE pouzit pro detail parametrizovany dotaz (kvuli prepare) a
nasledne na afterscroll
vdy polozit serveru znovu dotaz, ale s novym parametrem.
Proste stejne jako to byvalo u DBE, nebo IBX.
Slavek
Odpovedá: Jan Grman
20. 9. 2002 16:40
Zdravim priatelia.
1. TSQLClientDataSet je prostriedkom pre tvorbu 2 vrstvovych aplikacii. Je to
MEMORY tabulka. Je urcena pre male objemy dat a umoznuje obojsmerny pohyb.
Osobne mi je nejasne - kto to moze pouzivat ! Vo viacvstvovych aplikacia sa
pouziva standardna cesta TSQLQuery -> TProvider -> TClientDataSet
2. Jednosmerne kurzory - konecne sa nejaky driver nemontuje do toho akym
sposobom si vytiahnem data a ako si urobim cache - ak tvrdis ze sa s tym v
podstate neda nic robit - precitaj si nieco o tom a o DB obecne
3. vazby M / D sa daju realizovat na roznej urovni komponetov delphi a je vela
moznosti - skus sa s tym pohrat - precitat si nieco viac
Napr. - M / D mozes realizovat nad TSQLQuery komponentami a len vysledky si
prenasat do TClientDataSet (cez Provider).
jg
Takze cele dbx vyzera velmi zaujimavo:
1. najprv sa clovek dozvie, ze je to vyborna vec, ze je to rychle. ---------
>>>>
2. potom sa dozviem, ze sa jedna o jedmosmerne kurzory a neda sa s tym v
podstate nic robit. --------->>>>
3. potom sa dozviem, ze je tam komponenta sqlclientdataset, ktoru ked
pouzijem, tak je vsetko ok --------->>>>
4. a potom sa dozviem, ze ak sa jedna o vazbu master-detail, tak je
nepouzitelna, lebo je neskutocne pomala --------->>>>
Odpovedá: ing. Jan Fiala
20. 9. 2002 17:54
20.9.2002 Jan Sebelík:
> Odesílatel: Hlas <hlas@inmail.sk>
> Takze cele dbx vyzera velmi zaujimavo:
> 1. najprv sa clovek dozvie, ze je to vyborna vec, ze je to rychle. ---------
>>>>
Vzhledem k funkcnosti a jednoduchosti by to melo byt rychle
> 2. potom sa dozviem, ze sa jedna o jedmosmerne kurzory a neda sa s tym v
podstate nic robit. --------->>>>
A co vic potrebujes, nez udelat dotaz nebo spustit ulozenou proceduru,
popr. provest nejaky ten insert nebo update ?
Editace dat v Gridu a cached update by ses mel s SQL vyhnout.
> 3. potom sa dozviem, ze je tam komponenta sqlclientdataset, ktoru ked
pouzijem, tak je vsetko ok --------->>>>
To je prave pro ty gridoeditovace
--
ing. Jan Fiala
mailto:jan.fiala@iol.cz
Odpovedá: Jan Sebelík
21. 9. 2002 9:56
> Odesílatel: Skopalik Slavomir <skopalik@hlubocky.del.cz>
[Honza]
> > 1.
> > Pokud svazu master-detail ty SQLDataSety, pak do jedineho TClientDataSet
(privazaneho pres ProviderName na master) dostavam detail tabulku jako
TDatasetField.
> > 2.
> > "Master" i "detail" ClientDataSet ma svuj provider. Jsou svazany pres
MasterSource a MasterField.
> > Pak si kazdy ClientDataSet nacita cela data sam a k vazbe dochazi az na
urovni techto ClientDataSetu.
> > Je to cele v pameti, takze by to melo byt docela rychle.
[Slavek]
> 2.
> Myslim, ze tohle je prave ten problem. Normalni vazba Master-Detail je pres
index, tim DB stroj eliminuje
> znacnou cast operaci (tedy pokud se bavime o veljkych datech a inteligentnim
navrhu DB).
> Podle meho je NUTNE pouzit pro detail parametrizovany dotaz (kvuli prepare) a
nasledne na afterscroll
> vdy polozit serveru znovu dotaz, ale s novym parametrem.
Problem je, ze master ClientDataSet nacita veskera data.
Je treba je vyrazne omezit ve "where".
Domnivam se, ze prave zpusob 1. funguje tak, jak to ty pozadujes:
Detail SQLDataSet ma select ve tvaru "select * from tab2 where id=:id". Na ID
je foreign key, takze index. Pri nacitani master tabulky je (nejspis) na kazdem
jejim radku posilan ten parametrizovany select na detail tabulku do databaze.
Naopak zpusob 2. nacte rychle data do master i detail (dva selecty do
databaze).
DetailClientDataSet si v pripade potreby data v pameti pretridi a pri scroll na
masteru uz saha do dat pripravenych v pameti.
Nevim, co je lepsi, nevim, ktery zpusob je v dokumentaci myslen, kdyz se rika,
ze "SQLClientDataSet neni optimalizovan pro vazby master-detail".
Honza
=========================================
= HAES - RNDr. Jan Sebelik
= http://www.haes.cz
= Skolici a konzultacni stredisko pro Delphi a Win32
= Vojtiskova 206
= 507 81 Lazne Belohrad
= tel. 0434 692 569 (0776 347735)
=========================================